package org.pray.activity.invoke;

import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * InvokeTest
 *
 * @author 春江花朝秋月夜
 * @since 2024/3/17 15:23
 */
public class InvokeTest {
    public static void main(String[] args) {
        SubjectImpl subject = new SubjectImpl();   //被代理的大冤种
        InvocationHandler handler = new JDKProxy(subject);
        Subject jdkproxy = (Subject) Proxy.newProxyInstance(
                subject.getClass().getClassLoader(),    //需要传入被代理的类的类加载器
                subject.getClass().getInterfaces(),    //需要传入被代理的类的接口列表
                handler);    //最后传入我们实现的代理处理逻辑实现类
        jdkproxy.test();    //比如现在我们调用代理类的test方法，那么就会进入到我们上面TestProxy中invoke方法，走我们的代理逻辑


        Enhancer enhancer = new Enhancer();   //增强器，一会就需要依靠增强器来为我们生成动态代理对象
        enhancer.setSuperclass(SubjectImpl.class);    //直接选择我们需要代理的类型，直接不需要接口或是抽象类，SuperClass作为代理类的父类存在，这样我们就可以按照指定类型的方式去操作代理类了
        enhancer.setCallback(new CGLProxy(subject));  //设定我们刚刚编写好的代理逻辑

        SubjectImpl cglproxy = (SubjectImpl) enhancer.create();   //直接创建代理类

        cglproxy.test();   //调用代理类的test方法
    }
}
